{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "49d6b7b8-26ff-4a79-a1a4-b3a751ab18eb",
   "metadata": {},
   "source": [
    "# 零、基本概念"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6266a1b3-9eaa-44fa-bfc4-6b99498e98c1",
   "metadata": {},
   "source": [
    "## (一)概率率与统计"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ba873a00-1ae7-4e4f-8e1f-242b62855387",
   "metadata": {},
   "source": [
    "### [1. PDF、PMF、CDF、CCDF](https://www.zhihu.com/question/36853661/answer/2780428963)：\n",
    "\n",
    "**概念**\n",
    "\n",
    "- PDF：概率密度函数（probability density function）, 在数学中，连续型随机变量的概率密度函数（在不至于混淆时可以简称为密度函数）是一个描述这个随机变量的输出值，在某个确定的取值点附近的可能性的函数。\n",
    "\n",
    "- PMF：概率质量函数（probability mass function), 在概率论中，概率质量函数是离散型随机变量在各特定取值上的概率。\n",
    "\n",
    "- CDF：累积分布函数 (cumulative distribution function) ，又叫分布函数，是概率密度函数的积分，能完整描述一个实随机变量X的概率分布\n",
    "\n",
    "- CCDF：1-CDF\n",
    "\n",
    "**区别**\n",
    "\n",
    "- PDF是连续变量特有的，PMF是离散随机变量特有的。\n",
    "\n",
    "- PDF的取值本身不是概率，它是一种趋势（密度）只有对连续随机变量的取值进行积分后才是概率，也就是说对于连续值确定它在某一点的概率是没有意义的。\n",
    "\n",
    "- PMF的取值本身代表该值的概率。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a6b2587d-8df8-4596-b083-d2f9cfa1f70c",
   "metadata": {},
   "source": [
    "### 2.置信水平和显著性水平\n",
    "\n",
    "- <mark> **置信水平:**</mark>一般地，如果将构造置信区间的步骤重复多次，置信区间中包含总体参数真值的次数所占的比例称为置信水平（$1-\\alpha,\\alpha$ 称为风险值），也称为置信度或置信系数。\n",
    "  \n",
    "- <mark>**显著水平:**</mark>假设检验中的$\\alpha$称为显著水平，在假设检验中，它的含义是当原假设正确却被拒绝的概率或风险，也就是弃真错误的概率。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "97829c3f-65a0-4200-ad47-71658ed643fb",
   "metadata": {},
   "source": [
    "### 3.相关系数\n",
    "\n",
    "线性相关系数(correlation coefficient):是根据样本数据计算的度量两个变量之间线性关系强度的统计量。\n",
    "    \n",
    "秩相关系数（Coefficient of Rank Correlation），又称等级相关系数，反映的是两个随机变量的的变化趋势方向和强度之间的关联，是将两个随机变量的样本值按数据的大小顺序排列位次，以各要素样本值的位次代替实际数据而求得的一种统计量。它是反映等级相关程度的统计分析指标，常用的等级相关分析方法有Spearman相关系数和Kendall秩相关系数等。这里是秩序的秩，或者说排名、顺序、等级的意思。考虑两个随机变量X和Y，如果秩相关系数为正，则Y 随着X的增加而增加；如果秩相关系数为负，则Y随着X的增加而减小；如果秩相关系数为0，则表示随着Y的增减变化跟X的增减变化没啥关系。当Y和X越来越接近严格单调的函数关系时，秩相关系数在数值上就越来越大。当秩相关系数为1或者-1时，就表明Y随着X的增加而严格单调增加或单调减小。\n",
    "\n",
    "\n",
    "#### [(1)Pearson相关系数](https://chenxiaoyuan.blog.csdn.net/article/details/121576303)\n",
    "- 皮尔逊相关系数（Pearson correlation coefficient)也称为线性相关系数(linear correlation coefficient)。\n",
    "-  两个变量之间的总体(population)的皮尔逊相关系数定义为两个变量之间的协方差和标准差之积的商（或者说，归一化的协方差），通常用$\\rho$表示，定义如下：$$\\rho_{XY} = \\frac{cov(X,Y)}{\\sigma_X\\sigma_Y} = \\frac{E[(X-\\bar X)(Y-\\bar Y)]}{\\sqrt{\\sigma^2_X\\sigma^2_Y}}$$\n",
    "-  样本皮尔逊相关系数的计算公式为：\n",
    "\n",
    "$$r_{XY}=\\frac{\\sum_{i = 1}^{n}(x_{i}-\\bar{x})(y_{i}-\\bar{y})}{\\sqrt{\\sum_{i = 1}^{n}(x_{i}-\\bar{x})^{2}}\\sqrt{\\sum_{i = 1}^{n}(y_{i}-\\bar{y})^{2}}}$$\n",
    "- 性质如下：\n",
    "    - ①r的取值范围在[-1,1]之间\n",
    "    - ②r具有对称性\n",
    "    - ③r的数值大小与x和y的原点及尺度无关\n",
    "    - ④r仅仅是x与y之间线性关系的一个度量，不能描述非线性关系。\n",
    "    - ⑤r虽然是两个变量之间线性关系的一个度量，并不意味着x与y一定有因果关系。\n",
    "\n",
    "\n",
    "- [5个假设：](https://blog.csdn.net/chenxy_bwave/article/details/121435591)\n",
    "    - ① 要求两个变量同是以等距尺度或者同是以等比尺度进行测量的。\n",
    "    - ② 皮尔逊相关系数是用于衡量两个变量之间的线性关系（线性相关度）的，所以自然是要求两个变量之间本来是存在线性关系的。\n",
    "    - ③皮尔逊相关系数假设两个变量都是近似于正态分布。\n",
    "    - ④关联数据对：作为一个直观的理解，其实就是要求两个待测变量的数据样本必须是一一对应的。比如说，你要计算身高和体重的相关性的话，那对应于每个身高的测量数据必须有一个对应的体重测量数据，而且这种一一对应关系是确定性的。更具体一点说，每一对身高数据和体重数据必须是属于同一人的。比如说不能随机地打乱待测数据的顺序再进行相关系数计算，这样计算出来的相关系数是没有意义的。\n",
    "    - ⑤没有异常值：皮尔逊相关系数对于异常值非常敏感，因此如果数据样本集中存在极端的异常值的话，会导致皮尔逊相关系数估计失去其可信度。所以在进行皮尔逊相关系数之前需要检查是否存在异常值，并进行响应的异常值去除处理。\n",
    "\n",
    "- r的显著性检验$t = \\vert r \\vert\\sqrt{\\frac{n-2}{1-r^2}} \\sim t(n-2)$\n",
    "\n",
    "#### [(2)斯皮尔曼相关系数(Spearman correlation coefficient)](https://blog.csdn.net/chenxy_bwave/article/details/121427036)\n",
    "\n",
    "-  斯皮尔曼秩相关系数(The Spearman’s rank coefficient of correlation)，简称斯皮尔曼相关系数，是秩相关(rank correlation)的一种非参数度量(nonparametric measure)。\n",
    "-  皮尔逊相关是关于两个随机变量之间的线性关系强度的统计度量(statistical measure)，而斯皮尔曼相关考察的是两者单调关系（monotonic relationship）的强度，通俗地说就是两者在变大或变小的趋势上多大程度上保持步调一致，哪怕没有保持比例关系。计算皮尔逊相关系数时使用的是数据样本值本身，而计算斯皮尔曼相关系数使用的是数据样本排位位次值（有时候数据本身就是位次值，有时候数据本身不是位次值，则在计算斯皮尔曼相关系数之前要先计算位次值）。\n",
    "-   能够适用皮尔逊相关的场合当然是优先使用皮尔逊相关，但是在有些场合，皮尔逊相关所需要的前提假设不能得到满足，这是就可以考虑使用斯皮尔曼相关，比如说以下一些情况下：\n",
    "    - ①如果你的数据展现的是非线性关系，或者不是正态分布的。\n",
    "    - ②如果至少有一方数据是序数类型（ordinal）而非数值类型。比如说，如果数据的赋值为\"第一、第二、第三、... \"你就是在处理序数类型数据。更具具体一点的例子就是，比如说你考察两个球队在历年联赛中的战绩之间的关系，那么你得到的数据可能是这样的：A队在2010-2020年间的联赛排名为{1,2,4,5,...,2}, B队在2010-2020年间的联赛排名为{2,1,3,6,...,4}。这两个数据就是序数类型的数据，考察它们的相关性你使用皮尔逊相关系数就不妥当。\n",
    "    - 如果数据中有明显的异常值（outliers）。与皮尔逊相关不同，斯皮尔曼相关对于异常值不太敏感，因为它基于排序位次进行计算，实际数值之间的差异大小对于计算结果没有直接影响。\n",
    "    - 比如说，你可以利用斯皮尔曼相关来寻找针对以下一些问题的答案：\n",
    "        - 受教育水平更高的人更关心环境吗？\n",
    "        - 患者的症状数与他们服药的意愿有关系吗？\n",
    "        - 球队的联赛成绩（名次）与他们所在城市的经济发展水平有关系吗？\n",
    "-   行计算公式为$$\\rho = 1- \\frac{6\\sum d_i}{n(n^2-1)}$$,其中$d_i$ 表示第i个数据对的位次值之差,n总的观测样本数。\n",
    "\n",
    "#### [(3)肯德尔相关系数(Kendall correlation coefficient)](https://chenxiaoyuan.blog.csdn.net/article/details/126919019)\n",
    "\n",
    "- 肯德尔相关又名肯德尔秩相关（Kendall Rank Correlation），肯德尔相关系数通常用希腊字母$\\tau$来表示。\n",
    "- 与斯皮尔曼秩相关相似的是，肯德尔相关也是一种秩相关系数，是基于数据对象的秩（rank）来进行两个（随机变量）之间的相关关系（强弱和方向）的评估。所分析的目标对象应该是一种有序的类别变量，比如名次、年龄段、肥胖等级(重度肥胖，中度肥胖、轻度肥胖、不肥胖)等。\n",
    "- 不同的是，斯皮尔曼相关是基于秩差（比如说，小明在班级中的历史成绩排名为10，英语成绩排名为4，那么在这个班级的学生的历史成绩和英语成绩的斯皮尔曼相关分析中，小明的成绩的贡献就是(10-4=6) ）来进行相关关系的评估；而肯德尔相关则是基于<mark>**样本数据对**</mark>之间的关系来进行相关系数的强弱的分析。\n",
    "- 数据对可以分为一致对(Concordant)和分歧对(Discordant)：\n",
    "    - 比如说变量X的两个样本值记为$x_1$和$x_2$，与之相对应的变量Y的两个样本值分别记为$y_1$和$y_2$。\n",
    "    -  一致对(Concordant)是指两个变量的这一对样本值取值的相对关系一致，可以理解为$x_2-x_1$与$y_2-y_1$有相同的符号，即$(x_2-x_1)(y_2-y_1)\\ge 0$；\n",
    "    - 分歧对是指这一对样本值取值的相对关系不一致，即$(x_2-x_1)(y_2-y_1)\\lt 0$。\n",
    "- 当数据样本比较小，而且存在并列排位（tied ranks，比如说小明的历史成绩和英语成绩排名都是第8名）时，肯德尔相关系数是比斯皮尔曼相关系数更合适的一个相关性衡量指标。  适合于采用肯德尔相关系数分析的一些问题如下：\n",
    "    - 学生的考试成绩分级 (A, B, C…) 和他平均每天学习所投入的时间分级 (<2 hours, 2–4 hours, 5–7 hours…)时间的相关性；\n",
    "    - 顾客满意度 (比如说：非常满意，比较满意，一般。。。) 以及递送时间 (< 30 Minutes, 30 minutes — 1 Hour, 1–2 Hours etc)\n",
    "- 肯德尔相关的假设\n",
    "    - 变量数据是有序的（ ordinal） 或者是连续的（continuous）。\n",
    "    - 两个变量的数据之间应该遵循单调关系（ monotonic relationship）。 简而言之就是，其中一个变量的值增大，另一个也增大，这个称为正相关；或者一个变量的值增大，另一个就变小，这个称为负相关。当然，这个单调关系是一个统计意义上的，或者说一种趋势上的，而非严格的单调。\n",
    "-  肯德尔系数有两个计算公式，一个称为Tau-c，另一个称为Tau-a。两者的区别是Tau-b可以处理有相同值的情况，即并列排位(tied ranks)。\n",
    "    -  Tau-a:$$\\tau_a = \\frac{c-d}{\\frac{1}{2}n(n-1)}$$ Tau-a的计算中假定原始数据中不存在并列排位。其中，n表示样本个数。肯德尔相关系数是基于数据对来进行分析的，n个样本每两两组队所得到的组队数就是$\\frac{1}{2}n(n-1)$，Tau-a的分母即来自于此。分子中c和d则分别代表一致对和分歧对的个数。\n",
    "    -  Tau-b:$$\\tau_b = \\frac{c-d}{\\sqrt{(c+d+t_x)(c+d+t_y)}}$$ 其中c和d则分别代表一致对和分歧对的个数，$t_x$和$t_y$则分别表示数据X中的并列排位个数，和数据Y中的并列排位个数。注意，如果是同时发生在X和Y中并列排位，则既不计入$t_x$，也不计入$t_y$。 "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1e43565a-90f6-47d5-8204-061b85767f1f",
   "metadata": {},
   "source": [
    "[**Kendall相关系数的一致对和不一致对**](https://blog.csdn.net/qq_42761751/article/details/144523197)\n",
    "\n",
    "**假设我们现在有两个变量：**\n",
    "\n",
    "X=[1,2,3,4]\n",
    "\n",
    "Y=[2,3,1,4]\n",
    "\n",
    "**比较每一对观测值的关系：**\n",
    "\n",
    "$(x_1,x_2)$和$(y_1,y_2)$一致对\n",
    "\n",
    "$(x_1,x_3)$和$(y_1,y_3)$不一致对\n",
    "\n",
    "$(x_1,x_4)$和$(y_1,y_4)$一致对\n",
    "\n",
    "$(x_2,x_3)$和$(y_2,y_3)$不一致对\n",
    "\n",
    "$(x_2,x_4)$和$(y_2,y_4)$一致对\n",
    "\n",
    "$(x_3,x_4)$和$(y_3,y_4)$一致对\n",
    "\n",
    "**因此:**\n",
    "\n",
    "一致对数量 c= 4,不一直对d=3"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fe1a196e-b20d-4e9e-995a-863d7aab6e6e",
   "metadata": {},
   "source": [
    "### 4、假设检验\n",
    "<img src=\"ML img\\preview\\015d.png\" >\n",
    "\n",
    "- 假设检验中的两类错误\n",
    "\n",
    "|项目|没有拒绝$H_0$|拒绝$H_0$|\n",
    "|---|---:|---:|\n",
    "|$H_0$为真|$1-\\alpha$|$\\alpha$|\n",
    "|$H_0$为伪|$1-\\beta$|$\\beta$|\n",
    "\n",
    "哪一类错误所带来的后果越严重，危害越大，在假设检验中就应当把哪一类错误座位首要的控制目标。遵循首先控制$\\alpha$错误原则，主要原因是：原假设是什么常常是明确的，而备选假设是什么则常常是模糊的。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "37785135-cdb5-409c-a0b2-691c4b539262",
   "metadata": {},
   "source": [
    "### 5、卡方检验\n",
    "\n",
    " $\\chi^2$检验是对分类数据的频数进行分析的统计方法。设观察值频数为$f_o$，期望值频数为$f_e$，则$\\chi^2$统计量可以表示为： $$\\chi^2 = \\sum\\frac{(f_o-f_e)^2}{f_e}$$\n",
    "\n",
    "#### (1)拟合优度\n",
    "\n",
    "拟合优度检验，是依据总体分布状况，计算出分类变量中各类别的期望频数，与分布的观察频数进行对比，判断期望频数与观察频数是否有显著的差异，从而达到对分类变量进行分析的目的。\n",
    "\n",
    "<img src=\"ML img\\preview\\013b.png\" >\n",
    "\n",
    "#### （2）独立性检验\n",
    "拟合优度检验是对一个分类变量的检验，两个分类变量的分析，称为独立性检验，分析过程通过列联表的方式呈现，故有人把这种分析称为列联分析。独立性检验就是分析列联表中行变量和列变量是否相互独立。\n",
    "\n",
    "<img src=\"ML img\\preview\\014b.png\" >"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ba239b3d-d5a6-4d9f-a216-79d4e1a77cee",
   "metadata": {},
   "source": [
    "### 6、方差分析(Analysis of Variance,ANOVA)\n",
    "\n",
    "从形式上来看，方差分析是比较总体的均值是否相等，但本质上它所研究的是变量之间的关系(虽然感兴趣的是均值，但在判断均值之间的差异时需要借助于方差)。本质上是通过对数据误差来源的分类，来判断不同总体的均值是否相等，进而分析分类型自变量对数值型因变量是否有显著影响。\n",
    "\n",
    "一般来说，随着增加个体显著性检验的次数，偶然因素导致差别的可能性也会增加（并非均值真的存在差别）。方差分析方法则是考虑所有的样本，因此排除了错误累计的概率，从而避免拒绝一个真实的原假设。\n",
    "\n",
    "在方差分析中，所要检验的对象称为*因素或者因子（factor）*。因素的不同表现称为*水平或处理（treatment）*。每个因子水平下得到的样本数据称为观测值。\n",
    "- 行业 ——— 因素或因子\n",
    "- 零售业、旅游业、航空公司、家店制造业——— 水平或者处理\n",
    "- 每个行业下得到的样本数据（被投诉次数）——— 观测值\n",
    "- 因素的每个水平可以看做一个总体，观测数据是从总体中抽取出来的样本数据。\n",
    "\n",
    "误差分解：\n",
    "- **组内误差**：来自水平内部的数据误差称为组内误差，组内误差只含有随机误差。反映了一个样本内部数据的离散程度。\n",
    "- **组间误差**：来自不同水平之间的数据误差称为组间误差。这种差异可能是由抽样本身形成的随机误差，也可能是由行业本身的系统性造成的系统误差，因此，组间误差是随机误差和系统误差的总和。反映了不同样本间数据的离散程度。\n",
    "- **总平方和(SST)**:反映全部数据误差大小的平方和称为总平方和，记为$SST$。例如，所抽取的全部23家企业被投诉次数之间的误差平方和就是总平方和，它反映了全部观测值的离散状况。\n",
    "- **组内平方和**：反映组内误差大小的平方和称为组内平方和，也称为误差平方或残差平方和，记为$SSE$。例如，每个样本内部的数据平方和加在一起就是组内平方和，它反映了每个样本内各观测值的离散状况。\n",
    "-  **组间平方和**：放映组件误差大小的平方和称为组件平方和，也称为因素平方和，作为$SSA$。例如，四个行业被投诉次数之间的误差平方和就是组件平方和，它反映了样本均值之间的差异程度。\n",
    "- **总误差(SST)** = **组内误差(SSE)** + **组间误差(SSA)**\n",
    "\n",
    "**方差分析中三个基本假定**：\n",
    "- （1）每个总体都应服从正态分布；\n",
    "- （2）每个总体的方差$\\sigma^2$必须相同；\n",
    "- （3）观测值是独立的。\n",
    "\n",
    "**单因素方差分析**：单因素方差分析研究的是一个分类型自变量对一个数值型因变量的影响。\n",
    "\n",
    "**方差分析的步骤**\n",
    "设因素有k个水平，每个水平的均值分别用$\\mu_1,\\mu_2,\\cdots,\\mu_k$表示，要检验$k$个水平(总体)的均值是否相等。\n",
    "- (1)提出假设\n",
    "    - $H_0:\\mu_1 = \\mu_2 = \\cdots=\\mu_k \\quad\\quad$ 自变量对因变量没有显著影响\n",
    "    - $H_1:\\mu_1,\\mu_2 ,\\cdots=\\mu_k$不完全相等$\\quad\\quad$ 自变量对因变量有显著影响\n",
    "- (2)构建检验统计量\n",
    "    - ①计算各样本的均值，假定从第$i$个总体中抽取一个容量为$n_i$的简单随机样本，令$\\bar x_i$为第$i$个总体的样本均值，则有$$\\bar x_i=\\frac{\\sum\\limits_{j=1}^{n_i}x_{ij}}{n_i}$$\n",
    "    - ②计算全部观测值的总均值，设$n = n_1+n_2+\\cdots n_k$，则有$$\\bar{\\bar x} = \\frac{\\sum\\limits_{i=1}^k\\sum\\limits_{j=1}^{n_i}x_{ij}}{n} = \\frac{\\sum\\limits_{i=1}^kn_i\\bar x_i}{n}$$\n",
    "    - ③计算各误差平方和\n",
    "        - 总平方和（$SST$,sum of squares total）：$$SST = \\sum\\limits_{i=1}^k\\sum\\limits_{j=1}^{n_i}(x_{ij}-\\bar{\\bar x})^2$$\n",
    "        - 组间平方和（$SSA$，自变效应或者因子效应 sum of squares for factor A）：$$SSA = \\sum\\limits_{i=1}^kn_i(\\bar x_i-\\bar{\\bar x})^2$$\n",
    "        - 组内平方和（$SSE$，残差变量sum of square error）：$$SSE = \\sum\\limits_{i=1}^k\\sum\\limits_{j=1}^{n_i}(x_{ij}-\\bar x_i)^2$$\n",
    "    - ④计算统计量：由于各个误差平方和的大小与观测值的多少有关，为了消除观测值多少对于误差平方的影响，需要将其平均，也就是用各平方和除以它们对应的自由度，这一结果称为均方（mean square），也称为方差，三个平方和对应的自由度分别为：\n",
    "        -  $SST$的自由度为：$n-1$\n",
    "        -  $SSA$的自由度为：$k-1$\n",
    "        -  $SSE$的自由度为:$n-k$\n",
    "        -  组间均方或组间方差，记为$MSA$，计算公式为:$MSA = \\frac{SSA}{k-1}$\n",
    "        -  组内均方或组内方差，记为$MSE$,计算公式为：$MSE = \\frac{SSE}{n-k}$\n",
    "        -  计算服从自由度为$k-1,n-k$ 的$F$统计量$F = \\frac{MSA}{MSE}\\sim F(k-1,n-k)$\n",
    "- (3)作出决策\n",
    "    - 判断因素的水平是否对其观测值有显著影响，实际上也就是比较组间方差与组内方差之间的差异的大小。\n",
    "    - 设显著水平为$\\alpha$,分子自由度和分母自由度分别为$df_1=k-1,df_2=n-k$相应的临界值为$F_\\alpha(k-1,n-k)$。\n",
    "    - 若$F>F_\\alpha$,则拒绝原假设$H_0$，若$F\\lt F_\\alpha$,则不拒绝原假设。\n",
    "\n",
    "- 度量自变量与因变量之间的关系强度为：$R^2 = \\frac{SSA}{SST}$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "014524bd-93a1-434a-9222-8598b85aa796",
   "metadata": {},
   "source": [
    "### ANOVA(续1)\n",
    "\n",
    "**方差分析中的多重比较**\n",
    "\n",
    "<img src=\"ML img\\preview\\017.png\" width=600 height=400>\n",
    "\n",
    "多重比较法通过对总体均值之间的配对比较，来进一步检验到底哪些均值之间存在差异。其中，最小差异方法如下：\n",
    "- (1)提出假设:$H_0:\\mu_i=\\mu_j;H_1:\\mu_i\\neq \\mu_j$\n",
    "- (2)计算检验统计量：$\\bar x_i - \\bar x_j$\n",
    "- (3)计算$LSD$,其公式为$LSD = t_{\\alpha/2}\\sqrt{MSE(\\frac{1}{n_i}+\\frac{1}{n_j})}$，这里的t分布满足自由度为$n-k$，$k$为类别数。\n",
    "- (4)根据显著水平$\\alpha$作出决策。如果$|\\bar x_i - \\bar x_j|\\gt LSD$，则拒绝$H_0$;如果$|\\bar x_i - \\bar x_j|\\lt LSD$，则不决绝$H_0$\n",
    "<img src=\"ML img\\preview\\016.png\" width=500 height=300>\n",
    "\n",
    "**双因素方差分析**\n",
    "- 当方差分析中涉及两个分类型自变量时，称为双因素方差分析。\n",
    "- 两个自变量对因变量的影响是相互独立的，这时的双因素方差分析称为无交互作用的双因素方差分析，或称为无重复双因素分析；\n",
    "- 两个因素对因变量的影响是非独立的，两个因素结合后将会产生新效应，这时的双因素方差分析称为有交互作用的双因素方差分析或称为可重复双因素分析。\n",
    "\n",
    "**无交互作用的双因素方差分析**\n",
    "- (1)提出假设\n",
    "    - 对行因素提出的假设：\n",
    "        - $H_0:\\mu_1=\\mu_2=\\cdots\\mu_k$，行因素（自变量）对因变量没有显著影响。\n",
    "        - $H_1:\\mu_i(i=1,2,\\cdots,k)$不完全相等，行因素（自变量）对因变量有显著影响。\n",
    "    - 对列因素提出的假设：\n",
    "        - $H_0:\\mu_1=\\mu_2=\\cdots\\mu_r$，列因素（自变量）对因变量没有显著影响。\n",
    "        - $H_1:\\mu_i(i=1,2,\\cdots,k)$不完全相等，列因素（自变量）对因变量有显著影响。\n",
    "- (2)构造检验的统计量\n",
    "    - $SST = \\sum\\limits_{i=1}^k\\sum\\limits_{j=1}^r(x_{ij}-\\bar{\\bar x})^2$\n",
    "    - $SSR = \\sum\\limits_{i=1}^k\\sum\\limits_{j=1}^r(\\bar x_{i\\cdot}-\\bar{\\bar x})^2$\n",
    "    - $SSC = \\sum\\limits_{i=1}^k\\sum\\limits_{j=1}^r(\\bar x_{\\cdot j}-\\bar{\\bar x})^2$\n",
    "    - $SSE = \\sum\\limits_{i=1}^k\\sum\\limits_{j=1}^r(x_{ij}-\\bar x_{i\\cdot}-\\bar x_{\\cdot j} + \\bar{\\bar x})^2$\n",
    "    - $SST = SSR + SSC + SSE$\n",
    "    - $SST,SSR,SSC,SSE$的自由度分别为：$kr-1,k-1,r-1,(k-1)(r-1)$\n",
    "    - 行因素的均方:$MSR = \\frac{SSR}{k-1}$\n",
    "    - 列因素的均方:$MSC = \\frac{SSC}{r-1}$\n",
    "    - 误差项的均方:$MSE = \\frac{SSE}{(k-1)(r-1)}$\n",
    "    - 检验行因素变量的影响是否显著：$F_R = \\frac{MSR}{MSE}\\sim F(k-1,(k-1)(r-1))$\n",
    "    - 检验列因素变量的影响是否显著:$F_C = \\frac{MSC}{MSE}\\sim F(r-1,(k-1)(r-1))$\n",
    "- (3)作出决策\n",
    "    - 若$F_R>F_\\alpha$,则拒绝原假设$H_0$，若$F_R\\lt F_\\alpha$,则不拒绝原假设。\n",
    "    - 若$F_C>F_\\alpha$,则拒绝原假设$H_0$，若$F_C\\lt F_\\alpha$,则不拒绝原假设。\n",
    "      \n",
    "**关系强度的测量**\n",
    "\n",
    "$$R^2 = \\frac{SSR+SSC}{SST}$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5209a063-7f97-4133-b572-e932cc5916c9",
   "metadata": {},
   "source": [
    "### ANOVA(续2)\n",
    "\n",
    "**有交互作用的双因素方差分析**\n",
    "\n",
    "<img src=\"ML img\\preview\\018c.png\">\n",
    "\n",
    "**统计量定义如下:**\n",
    "\n",
    "- $SST = \\sum\\limits_{i=1}^k\\sum\\limits_{j=1}^r\\sum\\limits_{l=1}^m(x_{ijl}-\\bar{\\bar x})^2$\n",
    "- 行变量平方和：$SSR = rm\\sum\\limits_{i=1}^k(\\bar x_{i\\cdot}-\\bar{\\bar x})^2$\n",
    "- 列变量平方和：$SSC = km\\sum\\limits_{j=1}^r(\\bar x_{\\cdot j}-\\bar{\\bar x})^2$\n",
    "- 交互作用平方和：$SSRC = m\\sum\\limits_{i=1}^k\\sum\\limits_{j=1}^r(\\bar x_{ij}-\\bar x_{i\\cdot}-\\bar x_{\\cdot j} + \\bar{\\bar x})^2$\n",
    "- 误差平方和：$SSE = SST - SSR -SSC - SSRC$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8cecc6cd-ffc5-473f-82ca-a893a537433e",
   "metadata": {},
   "source": [
    "### [7.计量经济学的三大检验](https://blog.csdn.net/u011517132/article/details/105565678/)\n",
    "\n",
    "#### (1)似然比检验（LR）\n",
    "\n",
    "#### (2)沃尔德检验（Wald）\n",
    "\n",
    "#### (3)拉格朗日乘子检验（LM）"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1ffd58fe-eb6e-4310-904b-d17c20cf2745",
   "metadata": {},
   "source": [
    "## (二)信息论"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b16139e4-2e38-49f6-b459-140d07ba08eb",
   "metadata": {},
   "source": [
    "### [基本概念](https://www.cnblogs.com/kyrieng/p/8694705.html)\n",
    "\n",
    "#### (1)信息量\n",
    "- **定义**：衡量一个事件所包含的信息多少，事件发生概率越小，信息量越大。\n",
    "- **假设条件**：设事件 $X = x$ 发生的概率为 $P(x)$。\n",
    "- **数学公式**：$I(x)=-\\log(P(x))$（对数底数通常取 2、$e$ 或 10，底数为 2 时单位是比特）。\n",
    "- **性质**：\n",
    "    - 非负性：$I(x)\\geq0$，因为概率 $P(x)$ 取值在 $[0,1]$，对数函数性质使得 $-\\log(P(x))\\geq0$。\n",
    "    - 单调性：$P(x)$ 越大，$I(x)$ 越小；$P(x)$ 越小，$I(x)$ 越大，即信息量与事件发生概率成反比。\n",
    "\n",
    "#### (2)信息熵（香农熵）\n",
    "- **定义**：对随机变量不确定性的度量，即随机变量所有可能取值的平均信息量。\n",
    "- **假设条件**：设离散随机变量 $X$ 取值为 $x_1,x_2,\\cdots,x_n$，对应概率为 $P(x_1),P(x_2),\\cdots,P(x_n)$。\n",
    "- **数学公式**：$H(X)=-\\sum_{i = 1}^{n}P(x_i)\\log(P(x_i))$。\n",
    "- **性质**：\n",
    "    - 非负性：$H(X)\\geq0$，因为 $P(x_i)\\geq0$ 且 $-\\log(P(x_i))\\geq0$，求和后也非负。\n",
    "    - 极值性：当随机变量 $X$ 服从均匀分布时，$H(X)$ 达到最大值 $\\log n$，此时不确定性最大；当 $X$ 为确定值时，$H(X)=0$，不确定性最小。\n",
    "    - 可加性：对于两个相互独立的随机变量 $X$ 和 $Y$，有 $H(X,Y)=H(X)+H(Y)$。\n",
    "\n",
    "#### (3)联合熵\n",
    "- **定义**：衡量两个或多个随机变量的联合不确定性，即多个随机变量同时取值的平均信息量。\n",
    "- **假设条件**：设离散随机变量 $X$ 和 $Y$，其联合概率分布为 $P(x,y)$。\n",
    "- **数学公式**：$H(X,Y)=-\\sum_{x}\\sum_{y}P(x,y)\\log(P(x,y))$。\n",
    "- **性质**：\n",
    "    - 非负性：同信息熵，因为联合概率 $P(x,y)\\geq0$，所以 $H(X,Y)\\geq0$。\n",
    "    - 单调性：若 $X$ 和 $Y$ 的取值范围扩大，联合熵 $H(X,Y)$ 不会减小。\n",
    "    - 与信息熵关系：$H(X,Y)\\leq H(X)+H(Y)$，当且仅当 $X$ 和 $Y$ 相互独立时等号成立。\n",
    "\n",
    "#### (4)条件熵\n",
    "- **定义**：在已知一个随机变量取值的条件下，另一个随机变量的不确定性度量，即给定一个随机变量信息后，另一个随机变量剩余的不确定性。\n",
    "- **假设条件**：设离散随机变量 $X$ 和 $Y$。\n",
    "- **数学公式**：\n",
    "    - $H(X|Y)=-\\sum_{y}P(y)\\sum_{x}P(x|y)\\log(P(x|y)) = -\\sum_{y}P(y)H(X|Y=y))$ \n",
    "    - $H(X|Y)=\\sum_{x,y}P(x,y)\\log\\left(\\frac{P(y)}{P(x,y)}\\right)$\n",
    "- **性质**：\n",
    "    - 非负性：因为条件概率 $P(x|y)\\geq0$，所以 $H(X|Y)\\geq0$。\n",
    "    - 与信息熵关系：$H(X|Y)=H(X,Y)-H(Y)$，$H(X|Y)\\leq H(X)$，当且仅当 $X$ 和 $Y$ 相互独立时等号成立，即知道 $Y$ 的信息后，$X$ 的不确定性不会增加。\n",
    "\n",
    "#### (5)交叉熵\n",
    "- **定义**：衡量在给定真实分布的情况下，使用非真实分布进行编码时所需的平均比特数，机器学习中常作为损失函数衡量预测分布与真实分布差异。\n",
    "- **假设条件**：设 $P(x)$ 是真实概率分布，$Q(x)$ 是预测概率分布。\n",
    "- **数学公式**：$H(P,Q)=-\\sum_{x}P(x)\\log(Q(x))$。\n",
    "- **性质**：\n",
    "    - 非负性：由于 $P(x)\\geq0$ 且 $Q(x)\\in[0,1]$，所以 $-\\sum_{x}P(x)\\log(Q(x))\\geq0$。\n",
    "    - 与信息熵关系：$H(P,Q)=H(P)+D_{KL}(P||Q)$，其中 $H(P)$ 是真实分布 $P$ 的信息熵，$D_{KL}(P||Q)$ 是 $P$ 和 $Q$ 的 KL 散度，所以 $H(P,Q)\\geq H(P)$，当且仅当 $P = Q$ 时等号成立。\n",
    "\n",
    "#### (6)KL 散度（相对熵）\n",
    "- **定义**：衡量两个概率分布之间的差异程度，即使用分布 $Q$ 来近似分布 $P$ 时所损失的信息。\n",
    "- **假设条件**：设 $P(x)$ 和 $Q(x)$ 是两个概率分布。\n",
    "- **数学公式**：$D_{KL}(P||Q)=\\sum_{x}P(x)\\log\\left(\\frac{P(x)}{Q(x)}\\right)$（不具有对称性，$D_{KL}(P||Q)\\neq D_{KL}(Q||P)$）。\n",
    "- **性质**：\n",
    "    - 非负性：$D_{KL}(P||Q)\\geq0$，当且仅当 $P = Q$ 时等号成立，这是由对数函数的性质和概率分布的性质决定的。\n",
    "    - 不对称性：$D_{KL}(P||Q)\\neq D_{KL}(Q||P)$，即 $KL$ 散度不满足交换律，它不是一种真正的距离度量，但在很多应用中可以用来衡量两个分布的差异。\n",
    "\n",
    "#### (7)惊异（自信息）\n",
    "- **定义**：对单个事件所包含信息的度量，反映事件发生时的意外程度，事件发生概率越小，惊异越大。\n",
    "- **假设条件**：设事件 $X = x$ 发生的概率为 $P(x)$。\n",
    "- **数学公式**：$S(x)=-\\log(P(x))$。\n",
    "- **性质**：\n",
    "    - 与信息量性质相同，非负性：$S(x)\\geq0$。\n",
    "    - 单调性：$P(x)$ 越大，$S(x)$ 越小；$P(x)$ 越小，$S(x)$ 越大，与事件发生概率成反比。\n",
    "\n",
    "#### (8)互信息的相关内容：\n",
    "- **定义**：衡量两个随机变量之间相互依赖程度的度量，即一个随机变量包含另一个随机变量的信息量。\n",
    "- **假设条件**：设离散随机变量 $X$ 和 $Y$，其联合概率分布为$P(x,y)$，边缘概率分布分别为$P(x)$和$P(y)$。\n",
    "- **数学公式**：$I(X;Y)=\\sum_{x}\\sum_{y}P(x,y)\\log\\left(\\frac{P(x,y)}{P(x)P(y)}\\right)$。\n",
    "- **性质**：\n",
    "    - **非负性**：$I(X;Y)\\geq0$，当且仅当 $X$ 和 $Y$ 相互独立时，$I(X;Y)=0$，此时两个随机变量之间没有相互信息。\n",
    "    - **对称性**：$I(X;Y)=I(Y;X)$，即 $X$ 对 $Y$ 的互信息等于 $Y$ 对 $X$ 的互信息，反映了两个随机变量之间相互依赖关系的对称性。\n",
    "    - **与信息熵关系**：$I(X;Y)=H(X)-H(X|Y)=H(Y)-H(Y|X)=H(X)+H(Y)-H(X,Y)$，通过互信息可以将信息熵、条件熵和联合熵等概念联系起来。\n",
    "    - **极值性**：$I(X;Y)\\leq\\min\\{H(X),H(Y)\\}$，互信息不会超过任何一个随机变量的信息熵，因为它是一个随机变量从另一个随机变量中获取的信息量，必然小于等于自身的不确定度。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4e3f0077-613f-49f8-bfe8-3ecc0514f768",
   "metadata": {},
   "source": [
    "## (三)线性代数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2ded0548-1f3a-4963-9155-1168615740bf",
   "metadata": {},
   "source": [
    "### [1. 特征值和特征向量(eigenvalue and eigenvoctor)](https://blog.csdn.net/u010182633/article/details/45921929)\n",
    "- $Ax = \\lambda x$则称$\\lambda$为矩阵$A$ 的特征值，$x$为$A$的特征向量。表明矩阵作用在其特征向量时，该向量只发生了伸缩变换，它的方向没有改变，并没有旋转。\n",
    "\n",
    "- 计算特征向量也就是计算$Det(A-\\lambda I) = 0$,再根据特征值求取相应的特征向量。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b5c0c919-ab65-4808-904a-07ebb3a1a551",
   "metadata": {},
   "source": [
    "### [2.对称矩阵和反对称矩阵](https://zhuanlan.zhihu.com/p/37362255)\n",
    "\n",
    "- 主元(pivot element)，一种变元。指在消去过程中起主导作用的元素。主元就是在矩阵消去过程中,每列的要保留的非零元素,用它可以把该列其他消去。在阶梯型矩阵中,主元就是每个非零行第一个非零元素就是主元。\n",
    "\n",
    "- 对称矩阵满足：【1】沿对角线两边的元素，对称相等。【2】$A = A^T$ 【3】可以“挑选出”一组垂直的特征向量。\n",
    "\n",
    "- 对称矩阵的性质：【1】对称矩阵的主元正负个数与特征值的正负个数对应一致。也就是说正主元个数等于正特征值个数，负主元个数等于负特征值个数【2】对称矩阵的主元的乘积等于特征值的乘积(它们都等于矩阵行列式的值)。\n",
    "\n",
    "- 反对称矩阵满足 【1】$A^T = -A$ 【2】它的主对角线上的元素全为0，而位于主对角线两侧对称的元素反号。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9ad85c92-721a-47d9-bfab-978391620ab0",
   "metadata": {},
   "source": [
    "### [3.正定矩阵和半正定矩阵](https://blog.csdn.net/yzgkh/article/details/133391964)\n",
    "\n",
    "- (定义1) 给定一个大小为n×n的实对称矩阵A，若对于任意长度为n的非零行向量x，有$x^TAx>0$恒成立，则矩阵A是一个正定矩阵。\n",
    "证明正定矩阵过程利用矩阵乘法再结合定义即可得证。所谓正定矩阵就是一类对称矩阵，满足:【1】所有的特征值是正数 【2】所有主元为正数【3】所有子行列式为正。协方差矩阵就是一个正定矩阵（元素可以有负数）。\n",
    "\n",
    "- (定义2) 给定一个大小为n×n的实对称矩阵A，若对于任意长度为n的非零行向量x，有$x^TAx\\geq0$恒成立，则矩阵A是一个半正定矩阵。\n",
    "\n",
    " <div style=\"text-align: center;\">\n",
    "    <img src=\"ML img\\preview\\012.png\" >\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1b220e39-2c25-4bfa-9fc6-1007ba1277e2",
   "metadata": {},
   "source": [
    "### 4.正交矩阵的定义与性质\n",
    "\n",
    "| **分类**       | **具体内容**                                                                                                                                                                                                 |\n",
    "|----------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n",
    "| **定义**       | 1. **数学定义**：<br>  若 $ n $ 阶实方阵 $ Q $ 满足 $ Q^T Q = Q Q^T = I $（其中 $ Q^T $ 为转置矩阵，$ I $ 为单位矩阵），则称 $ Q $ 为正交矩阵。<br>  等价于 $ Q^T = Q^{-1} $。<br><br>2. **向量条件**：<br>  - 每一列是单位向量且两两正交（内积为0）；<br>  - 每一行也是单位向量且两两正交。                                                                 |\n",
    "| **核心性质**   | 1. **行列式**：$ \\det(Q) = 1 $ 或 $ \\det(Q) = -1 $（绝对值为1）。<br>2. **逆矩阵**：若 $ Q $ 是正交矩阵，则其逆矩阵 $ Q^{-1} = Q^T $ 也为正交矩阵。<br>3. **乘积性质**：两个正交矩阵的乘积仍为正交矩阵（即正交矩阵集对乘法封闭）。<br>4. **几何意义**：对应欧式空间中的正交变换（如旋转、反射），保持向量长度和夹角不变（即 $ \\|Q\\mathbf{v}\\| = \\|\\mathbf{v}\\| $，$ (Q\\mathbf{v})^T(Q\\mathbf{w}) = \\mathbf{v}^T\\mathbf{w} $）。 |\n",
    "| **补充说明**   | - 仅适用于实矩阵，复数域中对应概念为**酉矩阵**（满足 $ Q^* Q = I $，$ Q^* $ 为共轭转置）。<br>- 正交矩阵的列（或行）构成一组标准正交基。                                                                                                                                        |\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "274e37b9-3caa-4ca9-a2f3-61a5ff5dd7a2",
   "metadata": {},
   "source": [
    "\n",
    "### 5. 矩阵的迹：定义及性质\n",
    "\n",
    "\n",
    "#### (1)定义\n",
    "设 $A = (a_{ij}) $是一个 $n \\times n $的方阵，其 **迹（Trace）** 记作 $\\text{tr}(A) $，定义为主对角线元素之和：  \n",
    "$$\n",
    "\\text{tr}(A) = a_{11} + a_{22} + \\cdots + a_{nn} = \\sum_{i=1}^n a_{ii}.\n",
    "$$\n",
    "**注**：只有方阵才有迹，非方阵（如 $m \\times n, m \\neq n $）没有迹的定义。\n",
    "\n",
    "\n",
    "#### (2)基本性质\n",
    "以下性质均针对方阵 $A, B \\in \\mathbb{R}^{n \\times n} $和标量 $k \\in \\mathbb{R} $成立：  \n",
    "\n",
    "**性质1：线性性**  \n",
    "\n",
    "- 齐次性：$\\text{tr}(kA) = k \\cdot \\text{tr}(A) $ \n",
    "- 可加性：$\\text{tr}(A + B) = \\text{tr}(A) + \\text{tr}(B) $\n",
    "- 证明：直接由对角线元素的线性运算性质可得。  \n",
    "\n",
    "**性质2：转置不变性**  \n",
    "\n",
    "$$\n",
    "\\text{tr}(A^T) = \\text{tr}(A),\n",
    "$$\n",
    "因为转置不改变主对角线元素的位置。  \n",
    "\n",
    "**性质3：乘积的迹交换性**  \n",
    "\n",
    "若 $A \\in \\mathbb{R}^{m \\times n} $和 $B \\in \\mathbb{R}^{n \\times m} $（即 $AB $和 $BA $均为方阵），则  \n",
    "$$\n",
    "\\text{tr}(AB) = \\text{tr}(BA).\n",
    "$$\n",
    "特别地，当 $A, B $均为 $n \\times n $方阵时，该性质成立。  \n",
    "证明：通过展开乘积矩阵的对角线元素求和，利用乘法交换律可得（具体计算略）。  \n",
    "\n",
    "**性质4：相似矩阵的迹相同**  \n",
    "\n",
    "若 $A $和 $B $相似，即存在可逆矩阵 $P $使得 $A = PBP^{-1} $，则  \n",
    "$$\n",
    "\\text{tr}(A) = \\text{tr}(B).\n",
    "$$\n",
    "证明：利用性质 3，$\\text{tr}(A) = \\text{tr}(PBP^{-1}) = \\text{tr}(BP^{-1}P) = \\text{tr}(B) $。  \n",
    "\n",
    "**性质5：迹等于特征值之和**  \n",
    " \n",
    "设 $\\lambda_1, \\lambda_2, \\dots, \\lambda_n $是方阵 $A $的所有特征值（包含重根），则  \n",
    "$$\n",
    "\\text{tr}(A) = \\sum_{i=1}^n \\lambda_i.\n",
    "$$\n",
    "证明：根据矩阵的特征多项式 $\\det(\\lambda I - A) = \\prod_{i=1}^n (\\lambda - \\lambda_i) $，展开后对角线元素的和（即迹）等于特征值的和（由Vieta定理）。  \n",
    "\n",
    "**性质6：特殊矩阵的迹**  \n",
    "\n",
    "- 对角矩阵/三角矩阵：迹等于对角线元素之和（定义直接应用）。  \n",
    "- 零矩阵：$\\text{tr}(0) = 0 $。  \n",
    "- 单位矩阵：$\\text{tr}(I_n) = n $。  \n",
    "- 幂等矩阵（满足 $A^2 = A $）：迹等于矩阵的秩（因为其特征值只能是 0 或 1，且秩等于非零特征值的个数）。  \n",
    "\n",
    "\n",
    "#### (3)应用与意义  \n",
    "- 线性代数：迹是矩阵的重要不变量（相似变换下不变），常用于矩阵分解（如SVD、特征分解）和方程求解。  \n",
    "- 统计与机器学习：  \n",
    "  - 协方差矩阵的迹等于各变量的方差之和（总方差）。  \n",
    "  - 迹函数在优化问题中常作为正则化项（如核方法中的迹范数）。  \n",
    "- 物理与工程：迹可表示算子的“平均效应”，例如应力张量的迹对应流体静压力。  \n",
    "\n",
    "\n",
    "#### (4)注意事项\n",
    "- 迹仅定义于方阵，非方阵无迹。  \n",
    "- 虽然 $\\text{tr}(AB) = \\text{tr}(BA) $，但 $AB $和 $BA $的特征值可能不同（除非 $A, B $可交换）。  \n",
    "\n",
    "通过以上性质，矩阵的迹成为连接矩阵运算、特征值理论和实际应用的重要工具。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fba31c8e-2f91-4a73-98c0-b7c09785c057",
   "metadata": {},
   "source": [
    "## (四)高等数学"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3960b83d-5dae-4a4e-92c1-20d8f75a2563",
   "metadata": {},
   "source": [
    "### [1、泰勒公式](https://zhuanlan.zhihu.com/p/508226290)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1b164e4c-aa70-45c6-9e77-e6dee13f33fe",
   "metadata": {},
   "source": [
    "### [2、洛必达法则](https://www.zhihu.com/question/28862411)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4bcd759e-02c8-402e-b22c-9993134657c0",
   "metadata": {},
   "source": [
    "# 一、整体流程"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bdb785b8-ec69-4cbe-a123-b03c214eb538",
   "metadata": {},
   "source": [
    "<!-- <div style=\"text-align: center;\">\n",
    "    <img src=\"ML img\\ML.png\" width=\"337\" height=\"172\">\n",
    "</div>\n",
    " -->\n",
    " <div style=\"text-align: center;\">\n",
    "    <img src=\"ML img\\ML.png\" width=\"800\" height=\"600\">\n",
    "</div>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1934d07a-bb75-4cc8-ac12-9be6b1d6749a",
   "metadata": {},
   "source": [
    "# 二 、数据探索及预处理"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a4602f46-0edb-4887-8a63-eb231d3916ad",
   "metadata": {},
   "source": [
    "## （一）数据探索分析"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c9810058-7b9b-41b2-84ca-26de3f3e43d1",
   "metadata": {},
   "source": [
    " <div style=\"text-align: center;\">\n",
    "    <img src=\"ML img\\EDA.png\" width=\"400\" height=\"300\">\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1d84b7c0-2144-4366-840a-e7cd67c3cce9",
   "metadata": {},
   "source": [
    "### [1、数据质量分析](https://blog.csdn.net/weixin_30674525/article/details/99133458)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8f58be6c-6113-469f-bece-93ab5d6fab4f",
   "metadata": {},
   "source": [
    "#### (1)缺失值分析"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a5b805d2-2b2a-44ea-8ee2-5e1ad74098f8",
   "metadata": {},
   "source": [
    "用简单的统计分析，可以得到含有缺失值的属性的个数，以及每个属性的未缺失数、缺失数与缺失率等。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6204f45a-b0f1-49cd-a83f-d7d95db8f146",
   "metadata": {},
   "source": [
    "#### [(2)异常值分析](https://blog.csdn.net/Androilly/article/details/113180270)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8e2db48d-52f9-4be9-9a8a-916ed6aed081",
   "metadata": {},
   "source": [
    "##### ①基于统计的异常值检测方法\n",
    "基于统计的异常检测往往具有计算简单、有坚实的统计学基础等特点，但缺点也非常明显，例如需要大量的样本数据进行统计，难以对高维样本数据进行异常值检测等。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "96b5ec9e-b95a-4bee-83e5-e0319cce5576",
   "metadata": {},
   "source": [
    "- **3σ法则**：3σ法则是指在样本服从正态分布时，一般可认为小于μ-3σ或者大于μ+3σ的样本值为异常样本，其中μ为样本均值，σ为样本标准差。在实际使用中，我们虽然不知道样本的真实分布，但只要真实分布与正太分布相差不是太大，该经验法则在大部分情况下便是适用的。\n",
    "\n",
    " <div style=\"text-align: center;\">\n",
    "    <img src=\"ML img\\preview\\001.png\" width=\"540\" height=\"320\">\n",
    "</div>\n",
    "\n",
    "- **箱线图**：箱体图也是一种比较常见的异常值检测方法，一般取所有样本的25%分位点Q1和75%分位点Q3，两者之间的距离为箱体的长度IQR，可认为小于Q1-1.5IQR或者大于Q3+1.5IQR的样本值为异常样本。\n",
    "  \n",
    "<div style=\"text-align: center;\">\n",
    "    <img src=\"ML img\\preview\\002.png\" width=\"540\" height=\"215\">\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6a40ffca-1fca-4e1a-967f-0c232a56f779",
   "metadata": {},
   "source": [
    "##### ②基于模型的异常值检测\n",
    "\n",
    "通常可将异常值检测看作是一个二分类问题，即将所有样本分为正常样本和异常样本，但这和常规的二分类问题又有所区别，常规的二分类一般要求正负样本是均衡的，如果正负样本不均匀的话，训练结果往往会不太好。但在异常值检测问题中，往往面临着正（正常值）负（异常值）样本不均匀的问题，异常值通常比正常值要少得多，因此需要对常规的二分类模型做一些改进。基于模型的异常值检测一般可分为有监督模型异常值检测和无监督模型异常值检测。\n",
    "\n",
    "无监督模型的异常值检测是异常值检测中的主流方法，因为异常值的标注成本往往较高，另外异常值的产生往往无法预料，因此有些异常值可能在过去的样本中根本没有出现过，这将导致某些异常样本无法标注，这也是有监督模型的局限性所在。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "48f6e931-bd48-44d4-901d-b9e5c72ebd64",
   "metadata": {},
   "source": [
    "- **监督学习**：\n",
    "    - **oneclassSVM**：它用一个超球面替代了超平面，超球面以内的值为正常值，超球面以外的值为异常值。\n",
    "<div style=\"text-align: center;\">\n",
    "    <img src=\"ML img\\preview\\003.png\" width=\"540\" height=\"320\">\n",
    "</div>\n",
    "\n",
    "    - **自编码器（AE）**:将正常样本用于模型训练，输入与输出之间的损失函数可采用常见的均方误差，因此检测过程中，当正常样本输入时，均方误差会较小，当异常样本输入时，均方误差会较大，设置合适的阈值便可将异常样本检测出来。但该方法也有缺点，就是对于训练样本比较相近的正常样本判别较好，但若正常样本与训练样本相差较大，则可能会导致模型误判。\n",
    "<div style=\"text-align: center;\">\n",
    "    <img src=\"ML img\\preview\\004.png\" width=\"540\" height=\"320\">\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e1d803be-fcfb-4f64-9ad1-bb1c4ac6c5c8",
   "metadata": {},
   "source": [
    "- **非监督学习**\n",
    "    - **[密度聚类（DBSCAN）](https://www.zhihu.com/topic/26761782/top-answers?utm_id=0)** ：\n",
    "<img src=\"ML img\\preview\\005.png\">\n",
    "    - **[IsolationForest（IF）](https://cs.nju.edu.cn/zhouzh/zhouzh.files/publication/icdm08b.pdf):** 是一种非常高效的异常值检测方法，该方法不需要对样本数据做任何先验的假设，只需基于这样一个事实——异常值只是少数，并且它们具有与正常值非常不同的属性值。与随机森林由大量决策树组成一样，IsolationForest也由大量的树组成。IsolationForest中的树叫isolation tree，简称iTree。iTree树和决策树不太一样，其构建过程也比决策树简单，因为其中就是一个完全随机的过程。\n",
    "        - 假设数据集有N条数据，构建一颗iTree时，从N条数据中均匀抽样(一般是无放回抽样)出n个样本出来，作为这颗树的训练样本。\n",
    "        - 在样本中，随机选一个特征，并在这个特征的所有值范围内（最小值与最大值之间）随机选一个值，对样本进行二叉划分，将样本中小于该值的划分到节点的左边，大于等于该值的划分到节点的右边。\n",
    "        - 这样得到了一个分裂条件和左、右两边的数据集，然后分别在左右两边的数据集上重复上面的过程，直至达到终止条件。终止条件有两个，一个是数据本身不可再分(只包括一个样本，或者全部样本相同)，另外一个是树的高度达到log2(n)。不同于决策树，iTree在算法里面已经限制了树的高度。不限制虽然也可行，但出于效率考虑，算法一般要求高度达到log2(n)深度即可。\n",
    "        - 把所有的iTree树构建好了，就可以对测试数据进行预测了。预测的过程就是把测试数据在iTree树上沿对应的条件分支往下走，直到达到叶子节点，并记录这过程中经过的路径长度h(x)，即从根节点，穿过中间的节点，最后到达叶子节点，所走过的边的数量(path length)。\n",
    "        - 最后，将h(x)带入公式，其中E(.)表示计算期望，c(n)表示当样本数量为n时，路径长度的平均值，从而便可计算出每条待测数据的异常分数s(Anomaly Score)。异常分数s具有如下性质：1）如果分数s越接近1，则该样本是异常值的可能性越高；2）如果分数s越接近0，则该样本是正常值的可能性越高；\n",
    "        - 异常分数的计算公式为：$s(x,n) = 2^{-\\frac{E(h(x))}{c(n)}}$;其中$E(h(x)) = \\frac{\\sum_{i=1}^n h_i(x)}{n}$，其中i为第i棵孤立树，n为孤立树的总数；$c(n) = 2H(n − 1) − (2(n − 1)/n)$,这里的$H(n)$是调和级数（Harmonic Series），定义为:$H(n)=\\sum_i^n \\frac{1}{i}$。\n",
    "    - **RadomCutForest（RCF）:** RCF算法与IF算法思想上是比较类似的，前者可以看成是在IF算法上做了一些改进。针对IF算法中没有考虑到的时间序列因素，RCF算法考虑了该因素，并且在数据样本采样策略上作出了一些改进，使得异常值检测相对IF算法变得更加准确和高效，并能更好地应用于流式数据检测。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9b171c7c-c8bd-47e9-9523-f1de912f061e",
   "metadata": {},
   "source": [
    "#### [(3)一致性分析](https://blog.csdn.net/eylier/article/details/122103514)\n",
    "\n",
    "数据不一致性是指数据的矛盾性、不相容性。直接对不一致的数据进行挖掘，可能会产生与实际相违背的挖掘结果。在数据挖掘过程中，不一致数据的产生主要发生在数据集成的过程中，可能是由被挖掘数据来自于不同的数据源、对于重复存放的数据未能进行一致性更新造成的。例如，两张表中都存储了用户的电话号码，但在用户的电话号码发生改变时只更新了一张表中的数据，那么这两张表中就有了不一致的数据。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9bd9511b-3ba3-4384-9e68-4aae21513693",
   "metadata": {},
   "source": [
    "##### [①Kappa系数检验](https://zhuanlan.zhihu.com/p/67844308)\n",
    "Kappa一致性系数通常要求数据是定类数据。适用于两次数据（方法）之间比较一致性，比如两位医生的诊断是否一致，两位裁判的评分标准是否一致等。kappa系数的计算是基于混淆矩阵的，取值为-1到1之间,通常大于0。\n",
    "$$kappa = \\frac{p_o- p_e}{1-p_e}$$\n",
    "假设X是nxn方阵，$x_ij$是矩阵X的i行j列的元素其中：\n",
    "\n",
    "$$p_o = \\frac{\\sum\\limits_{i=1}^n x_{ii}}{\\sum\\limits_{i=1}^n {\\sum\\limits_{j=1}^n x_{ij}}}$$,就是acc\n",
    "\n",
    "$$p_e = \\frac{\\sum\\limits_{i=1}^n({\\sum\\limits_{j=1}^n x_{ij}\\times\\sum\\limits_{j=1}^n x_{ji}})}{(\\sum\\limits_{i=1}^n {\\sum\\limits_{j=1}^n x_{ij}})^2}$$,所有类别对应的实际与预测数量的乘积之和除以样本总数的平方。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "41304d3f-6ced-4939-bb10-a9f58e9a3086",
   "metadata": {},
   "source": [
    "##### [②ICC组内相关系数](https://zhuanlan.zhihu.com/p/657202764)\n",
    "<img src=\"ML img\\preview\\007.png\">\n",
    "\n",
    "以下是ICC计算公式参数选择：\n",
    "<img src=\"ML img\\preview\\0084.png\">\n",
    "<img src=\"ML img\\preview\\0085.png\">"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f7998f08-6a56-4436-a862-45fecf165064",
   "metadata": {},
   "source": [
    "##### [③Kendall协调系数](https://blog.csdn.net/weixin_50569789/article/details/139530166)\n",
    "<img src=\"ML img\\preview\\009.png\">"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8c5f81ca-5008-4d30-a20c-aca410b275e9",
   "metadata": {},
   "source": [
    "##### [④KDE](https://blog.csdn.net/pipisorry/article/details/53635895)\n",
    "直接看各种特征核密度分布是否一致。\n",
    "\n",
    "由给定样本集合求解随机变量的分布密度函数问题是概率统计学的基本问题之一。解决这一问题的方法包括参数估计和非参数估计。\n",
    "\n",
    "**参数估计**\n",
    "\n",
    "参数估计又可分为参数回归分析和参数判别分析。在参数回归分析中，人们假定数据分布符合某种特定的性态，如线性、可化线性或指数性态等，然后在目标函数族中寻找特定的解，即确定回归模型中的未知参数。在参数判别分析中，人们需要假定作为判别依据的、随机取值的数据样本在各个可能的类别中都服从特定的分布。经验和理论说明，参数模型的这种基本假定与实际的物理模型之间常常存在较大的差距，这些方法并非总能取得令人满意的结果。\n",
    "\n",
    "**非参数估计方法**\n",
    "\n",
    "由于上述缺陷，Rosenblatt和Parzen提出了非参数估计方法，即核密度估计方法。由于核密度估计方法不利用有关数据分布的先验知识，对数据分布不附加任何假定，是一种从数据样本本身出发研究数据分布特征的方法。核密度估计Kernel Density Estimation(KDE)是在概率论中用来估计未知的密度函数，属于非参数检验方法之一。\n",
    "\n",
    "在密度函数估计中有一种方法是被广泛应用的——直方图。如下图中的第一和第二幅图（名为Histogram和Histogram, bins shifted）。直方图的特点是简单易懂，但缺点在于以下三个方面：密度函数是不平滑的；密度函数受子区间（即每个直方体）宽度影响很大，同样的原始数据如果取不同的子区间范围，那么展示的结果可能是完全不同的。如下图中的前两个图，第二个图只是在第一个图的基础上，划分区间增加了0.75，但展现出的密度函数却看起来差异很大；直方图最多只能展示2维数据，如果维度更多则无法有效展示。\n",
    "\n",
    "核密度估计有多种内核，图3（Tophat Kernl Density）为不平滑内核，图4（Gaussian Kernel Density,bandwidth=0.75）为平滑内核。在很多情况下，平滑内核（如高斯核密度估计，Gaussian Kernel Density）使用场景较多。\n",
    "\n",
    "虽然采用不同的核函数都可以获得一致性的结论（整体趋势和密度分布规律性基本一致），但核密度函数也不是完美的。除了核算法的选择外，带宽（bandwidth）也会影响密度估计，过大或过小的带宽值都会影响估计结果。如上图中的最后三个图，名为Gaussian Kernel Density,bandwidth=0.75、Gaussian Kernel Density,bandwidth=0.25、Gaussian Kernel Density,bandwidth=0.55.\n",
    "\n",
    "<img src=\"ML img\\preview\\010.png\">\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a934d3cf-49eb-4d05-a1b3-24b104d1ee28",
   "metadata": {},
   "source": [
    "##### [⑤KS检验](https://www.cnblogs.com/arkenstone/p/5496761.html)\n",
    "\n",
    "是比较一个频率分布f(x)与理论分布g(x)或者两个观测值分布的检验方法。其原假设H0:两个数据分布一致或者数据符合理论分布。D=max| f(x)- g(x)|，当实际观测值D>D(n,α)则拒绝H0，否则则接受H0假设。\n",
    "\n",
    "KS检验与t-检验之类的其他方法不同是KS检验不需要知道数据的分布情况，可以算是一种非参数检验方法。当然这样方便的代价就是当检验的数据分布符合特定的分布事，KS检验的灵敏度没有相应的检验来的高。在样本量比较小的时候，KS检验作为非参数检验在分析两组数据之间是否不同时相当常用。\n",
    "\n",
    "t-检验的假设是检验的数据满足正态分布，否则对于小样本不满足正态分布的数据用t-检验就会造成较大的偏差，虽然对于大样本不满足正态分布的数据而言t-检验还是相当精确有效的手段。\n",
    "\n",
    "首先观察下分析数据\n",
    "\n",
    "对于以下两组数据：\n",
    "      \n",
    "controlB={1.26, 0.34, 0.70, 1.75, 50.57, 1.55, 0.08, 0.42, 0.50, 3.20, 0.15, 0.49, 0.95, 0.24, 1.37, 0.17, 6.98, 0.10, 0.94, 0.38}\n",
    "\n",
    "treatmentB= {2.37, 2.16, 14.82, 1.73, 41.04, 0.23, 1.32, 2.91, 39.41, 0.11, 27.44, 4.51, 0.51, 4.50, 0.18, 14.68, 4.66, 1.30, 2.06, 1.19}\n",
    "\n",
    "对于controlB，这些数据的统计描述如下：\n",
    "\n",
    "Mean = 3.61，Median = 0.60，High = 50.6， Low = 0.08，Standard Deviation = 11.2\n",
    "\n",
    "可以发现这组数据并不符合正态分布， 否则大约有15%的数据会小于均值-标准差（3.61-11.2），而数据中显然没有小于0的数。\n",
    "\n",
    "对controlB数据从小到大进行排序：sorted controlB={0.08, 0.10, 0.15, 0.17, 0.24, 0.34, 0.38, 0.42, 0.49, 0.50, 0.70, 0.94, 0.95, 1.26, 1.37, 1.55, 1.75, 3.20, 6.98, 50.57}。10%的数据（2/20）小于0.15，85%（17/20）的数据小于3。所以，对任何数x来说，其累计分段就是所有比x小的数在数据集中所占的比例。可以以看到大多数数据都集中在图片左侧（数据值比较小），这就是非正态分布的标志。\n",
    "\n",
    "为了更好的观测数据在x轴上的分布，可以对x轴的坐标进行非等分的划分。在数据都为正的时候有一个很好的方法就是对x轴进行log转换。reatmentB的数据也做相同的图，可以发现treatmentB和controlB的数据分布范围大致相同（0.1 - 50）。但是对于大部分x值，在controlB数据集中比x小的数据所占的比例比在treatmentB中要高，也就是说达到相同累计比例的值在treatment组中比control中要高。KS检验使用的是两条累计分布曲线之间的最大垂直差作为D值（statistic D）作为描述两组数据之间的差异。在此图中这个D值出现在x=1附近，而D值为0.45（0.65-0.25）。\n",
    "<img src=\"ML img\\preview\\0011.png\">\n",
    "\n",
    "这里的D(n,α)并没有指定分布，n是表示样本量，α表示显著性水平。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "116fb9b8-27a2-449a-a432-675e2fc1cc82",
   "metadata": {},
   "source": [
    "##### [⑥Overlap Rate](https://zhuanlan.zhihu.com/p/87838277)\n",
    "\n",
    "对于连续型变量我们可以使用KS检验来检测数据分布是否一致，对于类别型变量我们可以对其进行编码然后检测[4]，或者选择通过特征重合率来进行检测[5]，在高基数变量中此方法经常被用到。\n",
    "\n",
    "采用特征重合率对类别型数据分布的一致性进行检测的方法，是检测训练集特征在测试集中出现的比率，举个例子：\n",
    "```text\n",
    "训练集特征：[猫，狗，狗，猫，狗，狗，狗，猫] \n",
    "测试集特征：[猫，猫，鱼，猪，鱼，鱼，猪，猪]\n",
    "```\n",
    "即使该特征在训练集表现很好，但在测试集上的用处并不大，因为重合率仅有1/4，反而会导致过拟合或者模型忽略掉其他更有用的特征。\n",
    "\n",
    "**重合率的计算方法示例**\n",
    "\n",
    "- 首先要确定两个类别变量中相同类别的数量。假设变量A有m个类别，变量B有n个类别。\n",
    "- 统计同时出现在A和B中的类别数量，设为k。\n",
    "- 重合率的计算公式可以是:$$重合率 = \\frac{k}{\\min(m,n)}$$或者\n",
    "$$重合率 = \\frac{k}{m+n-k}$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4e9d879b-17bf-4b3b-a407-5fcd9a3348fe",
   "metadata": {},
   "source": [
    "##### [⑦KL散度](https://blog.csdn.net/Poyunji/article/details/123771660)\n",
    "\n",
    "<img src=\"ML img\\preview\\011.png\" width=600 height=300>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0dff9b71-59eb-4055-9ca8-64e3a3d02035",
   "metadata": {},
   "source": [
    "##### [⑧用机器学习模型检测分布是否一致](https://zhuanlan.zhihu.com/p/87838277)\n",
    "\n",
    "\n",
    "用特征训练模型来分辨训练集与测试集，若模型效果好的话代表训练集和测试集存在较大差异，否则代表训练集和测试集分布比较相似。具体做法是构建一个二分类模型，对训练集打上0，测试集打上1，然后shuffle一下进行训练，若分类效果好，代表训练集和测试集区分度很高，那么分布差异就较大。\n",
    "\n",
    "针对不同的模型检测分布会得到不同的效果，在实践中由于选定了预测模型，它对于某个特定场景的适应效果应该比常规的检测方法好很多。由此延申出来，我们用训练好的二分类模型对训练集进行预测，然后输出预测概率，根据这个概率为训练集设置权重（概率越接近1代表训练集分布更接近测试集），这样就可以强行过拟合到测试集上！对于非线上测试型的数据挖掘比赛应该会有比较大的提升！"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eaada601-11f4-4db2-8553-81931b3190ca",
   "metadata": {},
   "source": [
    "### 2、数据特征分析"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c7bec7cb-2927-418f-96e5-328757a8105a",
   "metadata": {},
   "source": [
    "#### [(1)分布分析](https://www.zhihu.com/question/287549457/answer/2251550485)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b535b646-3b05-4cba-a98e-7b8816f1da8c",
   "metadata": {},
   "source": [
    "##### ①集中趋势\n",
    "- 众数、中位数、四分位数、算术平均数\n",
    "- 调和平均数：$\\bar x_H = \\frac{n}{\\sum\\limits_{i=1}^n\\frac{1}{x_i}}$\n",
    "<img src=\"ML img\\preview\\0010.png\">\n",
    "- 几何平均数：主要用于计算平均比率，当变量本身是比率的形式时，用几何平均值计算平均比率更合理。例如计算平均增长率。$\\sqrt[n]{\\prod\\limits_{i=1}^n x_i}$\n",
    "\n",
    "##### ②离中趋势(离散程度)\n",
    "- 极差、四方位数间距、方差、标准差\n",
    "- 变异系数：$\\frac{\\sigma}{\\bar x}$\n",
    "\n",
    "##### ③偏度和峰度(形状)\n",
    "- 偏度：反映数据分布不对称的方向和程度\n",
    "- 峰度：反映数据分布图的尖峭程度或扁平程度\n",
    "\n",
    "##### ④百分比或者频数分布\n",
    "- 对于定性变量，常常根据变量的分类类型来分组，可以采用饼形图和条形图来描述定性变量的分布。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2ad43d8d-082f-425e-b219-9b74a37cd324",
   "metadata": {},
   "source": [
    "#### (2)对比分析\n",
    "\n",
    "##### ①绝对数比较\n",
    "\n",
    "它是利用绝对数进行对比，从而寻找差异的一种方法。\n",
    "\n",
    "##### ②相对数比较\n",
    "\n",
    "- 结构相对数：将同一总体内的部分数值与全部数值对比求得比重，用以说明事物的性质、结构或质量。例如，居民食品支出额占消费支出总额比重、产品合格率等。\n",
    "\n",
    "- 比例相对数：将同一总体内不同部分的数值对比，表明总体内各部分的比例关系，如人口性别比例、投资与消费比例等。\n",
    "\n",
    "- 比较相对数：将同一时期两个性质相同的指标数值对比，说明同类现象在不同空间条件下的数量对比关系。例如，不同地区商品价格对比，不同行业、不同企业间某项指标对比等。\n",
    "\n",
    "- 强度相对数：将两个性质不同但有一定联系的总量指标对比，用以说明现象的强度、密度和普遍程度。例如，人均国内生产总值用“元/人”表示，人口密度用“人/平方公里”表示，也有用百分数或千分数表示的，如人口出生率用‰表示。\n",
    "\n",
    "- 计划完成程度相对数：是某一时期实际完成数与计划数对比，用以说明计划完成程度。\n",
    "\n",
    "- 动态相对数：将同一现象在不同时期的指标数值对比，用以说明发展方向和变化的速度，如发展速度、增长速度等。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "29e944ce-3e29-4574-9fa6-395934b05d95",
   "metadata": {},
   "source": [
    "#### (3)统计量分析"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d8a09dcf-d107-4ba8-86f2-0b4ae6712fb2",
   "metadata": {},
   "source": [
    "#### [(4)相关性分析](https://blog.csdn.net/baidu_26137595/article/details/124021788)\n",
    "\n",
    "|自变量、因变量数据类型|\t检验方法|可视化图形|\n",
    "| --- | ---: | ---: |\n",
    "|数值型&数值型|\t相关系数|\t散点图（大数据量不建议使用）|\n",
    "|数值型&二分类型|\tt检验/z检验|\t分组箱线图、logit图（因变量为二分类，自变量为连续型）|\n",
    "|分类型&数值型|\t卡方检验|\t堆叠图、改进的堆叠图|\n",
    "|多分类型&数值型|\t方差分析(ANOVA)|\t分组箱线图|\n",
    "\n",
    "\n",
    "##### ①相关系数\n",
    "- Pearson相关系数(线性相关系数)\n",
    "- Spearman相关系数(斯皮尔曼相关系数被定义成等级变量之间的皮尔逊相关系数)\n",
    "- Kendall相关系数\n",
    "\n",
    "##### ②假设检验\n",
    "\n",
    "\n",
    "##### ③卡方检验\n",
    "- 拟合优度\n",
    "- 独立性检验\n",
    "\n",
    "##### ④方差分析"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "48e7aabe-e4db-404c-a5e5-824a3bb0a68a",
   "metadata": {},
   "source": [
    "## [（二）缺失值填充](https://blog.csdn.net/weixin_38037405/article/details/125455194) "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "116874c2-2e1f-4ef0-9244-0f3176f66b21",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "### 1、Complete Case Analysis(CCA)：\n",
    "\n",
    "是一种非常简单的处理缺失数据的方法，它直接删除包含缺失数据的行，即我们只考虑包含完整数据的行。这种策略较为直接，很容易实现，当然也会使我们损失非常多的数据信息。在预测存在缺失值的时候也会出现偏差。一般建议当我们的数据量足够大的时候，即缺失的数据占比非常小，而且有存在随机的情况。\n",
    "\n",
    "### 2、随机数填充：\n",
    "这是缺失值中填充的一项重要技术，它可以处理数值变量和分类变量。一般我们会对缺失值分组到一列中，并分配一个特殊的值，例如99999999或-999999等。这样我们保留了缺失值的特殊含义，在一些特殊的情况下，可以带来非常好的效果，但是缺点也很明显，我们这种填充策略对于目前的一些模型，例如NN等，进行预处理和训练预测带来一些挑战。\n",
    "\n",
    "### 3、类别特征的频率填充：\n",
    "用出现频率最高的变量值替换缺失的值，用该特征列的众数作为替换值。该方法实现简单，也较为常用，但是当数据缺失较大的时候，这样的填充会使得数据出现较大的偏差，使得预测结果较差。\n",
    "\n",
    "### 4、数值类型统计值填充：\n",
    "例如均值，中位数等。有的时候我们也可以使用正态分布的策略进行填充——使用与平均值相差2个标准差以内的值。在（平均值-2 std）&（平均值+2 std）之间生成随机数来填充缺失值。\n",
    "\n",
    "### 5、使用线性回归：\n",
    "通过两个变量的强相关性来进行线性拟合填充。注意线性回归时需要注意异常值的影响。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ef4111e5-e0bf-4fc6-9dd8-1884ae93d379",
   "metadata": {},
   "source": [
    "## [(三)异常值处理](https://blog.csdn.net/LIJIAN_A1/article/details/134206627)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4244702a-4aea-4e1b-a613-b8247cd7e1a6",
   "metadata": {},
   "source": [
    "### 1、删除异常值\n",
    "将异常值直接从数据集中删除，以减少其对模型的影响。这种方法简单易行，但可能会导致数据损失。而且，有些异常值可能只是因为数据采集或测量误差导致的。\n",
    "\n",
    "### 2、替换异常值\n",
    "用合适的值替换异常值，以减少其对模型的影响。常用的替换方法包括均值插补、中位数插补、回归插补等。\n",
    "\n",
    "### 3、忽略异常值\n",
    "某些情况下，某些异常值可能并不会对模型产生负面影响，因此可以考虑忽略它们。例如，在某些情况下，异常值可能只是因为测量误差或数据采集错误导致的。\n",
    "\n",
    "在进行异常值处理时，需要考虑业务需求和实际情况，以便选择最合适的处理方法。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9a9c4ab8-6b13-499b-ace2-5415b8c68846",
   "metadata": {},
   "source": [
    "## (四)数据不平衡问题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "eeb32788-7ee8-4aa6-a0fb-9b006d8c388f",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "77acb6c1-726f-431b-abb3-0fd60c390f6d",
   "metadata": {},
   "source": [
    "# 三、特征工程"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7af6fbdd-6a84-4ed6-b2bb-86cf7a5aca9b",
   "metadata": {},
   "source": [
    "## [(一)特征编码](https://blog.csdn.net/weixin_38037405/article/details/125960258)\n",
    "\n",
    "<img src='ML%20img/feature_encode_method.png' width=300 height=400>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "74071521-462d-4947-8cfa-c23303775023",
   "metadata": {},
   "source": [
    "### 1. 标签编码（Label Encoder）\n",
    "标签编码就是简单地赋予不同类别，不同的数字标签。属于硬编码，优点是简单直白。不建议用在高基类特征上，而且标签编码后的自然数对于回归任务来说是线性不可分的。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "ca22f9b4-c96a-4489-b4fc-fbc4466a83d3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 0, 1], dtype=int64)"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.preprocessing import LabelEncoder\n",
    "\n",
    "le = LabelEncoder()\n",
    "x = ['male', 'female', 'male']\n",
    "x_trans = le.fit_transform(x)\n",
    "x_trans"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b8e4b3b3-b095-41e5-8668-483153314a2b",
   "metadata": {},
   "source": [
    "### 2. 哈希编码（Hash Encoder）\n",
    "\n",
    "哈希编码是使用二进制对标签编码做哈希映射。好处在于哈希编码器不需要维持类别字典，若后续出现训练集未出现的类别，哈希编码。但按位分开哈希编码，模型学习相对比较困难。同时如果转换未出现的值，可能会存在不同的值编码一样的问题。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "744af88c-a655-4a89-9430-2a5ef232ba20",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col_0</th>\n",
       "      <th>col_1</th>\n",
       "      <th>col_2</th>\n",
       "      <th>col_3</th>\n",
       "      <th>col_4</th>\n",
       "      <th>col_5</th>\n",
       "      <th>col_6</th>\n",
       "      <th>col_7</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   col_0  col_1  col_2  col_3  col_4  col_5  col_6  col_7\n",
       "0      0      0      0      0      1      0      0      0\n",
       "1      0      0      0      1      0      0      0      0\n",
       "2      0      0      0      1      0      0      0      0"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# !pip install category_encoders -i https://pypi.tuna.tsinghua.edu.cn/simple/\n",
    "import pandas as pd\n",
    "import category_encoders as ce\n",
    "\n",
    "x = pd.DataFrame({'gender':[2, 1, 1]})\n",
    "ce_encoder = ce.HashingEncoder(cols = ['gender']).fit(x)\n",
    "x_trans = ce_encoder.transform(x)\n",
    "x_trans"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "c67357df-6e50-489c-88ff-85db3bd8fb13",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col_0</th>\n",
       "      <th>col_1</th>\n",
       "      <th>col_2</th>\n",
       "      <th>col_3</th>\n",
       "      <th>col_4</th>\n",
       "      <th>col_5</th>\n",
       "      <th>col_6</th>\n",
       "      <th>col_7</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   col_0  col_1  col_2  col_3  col_4  col_5  col_6  col_7\n",
       "0      0      0      0      0      1      0      0      0\n",
       "1      0      0      0      1      0      0      0      0\n",
       "2      0      0      0      1      0      0      0      0\n",
       "3      0      0      0      1      0      0      0      0\n",
       "4      0      0      0      0      0      1      0      0"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x1 = pd.DataFrame({'gender':[2, 1, 1,3,5]})\n",
    "ce_encoder.transform(x1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "800c69e7-9929-46f9-b39c-ec17a506ea15",
   "metadata": {},
   "source": [
    "### 3.独热码\n",
    "\n",
    "独热编码能很好解决标签编码对于回归任务中线性不可分的问题，它采用N位状态寄存器来对N个状态进行编码，简单来说就是利用0和1表示类别状态，它转换后的变量叫哑变量（dummy variables）。同样地，它处理不好高基数特征，基类越大会带来过很多列的稀疏特征，消耗内存和训练时间。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "3bd66bd9-cead-469e-b54b-19fb21bcdce3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>female</th>\n",
       "      <th>male</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   female  male\n",
       "0       0     1\n",
       "1       1     0\n",
       "2       0     1"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = pd.DataFrame({'gender':['male', 'female', 'male']})\n",
    "x_dummies = pd.get_dummies(x['gender'], dtype='int')\n",
    "\n",
    "x_dummies"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7e4871f8-277c-493c-a8a1-c1e0b9d47c1c",
   "metadata": {},
   "source": [
    "### 4.计数编码（Count Encoder)\n",
    "\n",
    "计数编码也叫频次编码。就是用分类特征下不同类别的样本数去编码类别。清晰地反映了类别在数据集中的出现次数，缺点是忽略类别的物理意义，比如说两个类别出现频次相当，但是在业务意义上，模型的重要性也许不一样。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "ed749aee-b84c-4324-8825-b33ed4f6782c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>cat_feat</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   cat_feat\n",
       "0         3\n",
       "1         3\n",
       "2         2\n",
       "3         1\n",
       "4         2\n",
       "5         3"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import category_encoders as ce\n",
    "df = pd.DataFrame({'cat_feat':['A', 'A', 'B', 'C', 'B', 'A']})\n",
    "count_encoder = ce.count.CountEncoder(cols = ['cat_feat']).fit(df)\n",
    "\n",
    "df_trans = count_encoder.transform(df)\n",
    "df_trans"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7348c0c0-d941-4f0d-bf84-2ccf48ec4b9c",
   "metadata": {},
   "source": [
    "### 5.直方图编码（Bin Encoder）\n",
    "\n",
    "直方图编码属于目标编码的一种，适用于分类任务。它先将类别属性分类，然后在对应属性下，统计不同类别标签的样本占比进行编码。直方图编码能清晰看出特征下不同类别对不同预测标签的贡献度，缺点在于：使用了标签数据，若训练集和测试集的类别特征分布不一致，那么编码结果容易引发过拟合。此外，直方图编码出的特征数量是分类标签的类别数量，若标签类别很多，可能会给训练带来空间和时间上的负担。\n",
    "\n",
    "\n",
    "<img src=\"ML img\\preview\\019.png\">"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0ce35f32-f647-48bb-810e-d5db34bafff3",
   "metadata": {},
   "source": [
    "### [6. WOE编码](https://zhuanlan.zhihu.com/p/80134853)\n",
    "\n",
    "\n",
    " WOE编码适用于二分类任务，WOE表明自变量相对于因变量的预测能力。由于它是从信用评分世界演变而来的，它通常被描述为区分好客户和坏客户的衡量标准。 在评分卡建模流程中，WOE（Weight of Evidence）常用于特征变换，IV（Information Value）则用来衡量特征的预测能力。\n",
    "\n",
    "#### （1）WOE编码在业务中的应用\n",
    "\n",
    "- 处理缺失值：当数据源没有100%覆盖时，那就会存在缺失值，此时可以把null单独作为一个分箱。这点在分数据源建模时非常有用，可以有效将覆盖率哪怕只有20%的数据源利用起来。\n",
    "- 处理异常值：当数据中存在离群点时，可以把其通过分箱离散化处理，从而提高变量的鲁棒性（抗干扰能力）。例如，age若出现200这种异常值，可分入“age > 60”这个分箱里，排除影响。\n",
    "- 业务解释性：我们习惯于线性判断变量的作用，当x越来越大，y就越来越大。但实际x与y之间经常存在着非线性关系，此时可经过WOE变换。\n",
    "\n",
    "#### （2）IV（Information Value）\n",
    "- 是与WOE密切相关的一个指标，常用来评估变量的预测能力。因而可用来快速筛选变量。在应用实践中，其评价标准如下：\n",
    "|IV范围|预测效果|英文描述|\n",
    "|---|---:|--:\n",
    "|小于0.02|几乎没有|Useless for prediction|\n",
    "|0.02~0.1|弱|Weak predictor|\n",
    "|0.1~0.3|中等|Medium predictor|\n",
    "|0.3~0.5|强|Strong predictor|\n",
    "|大于0.5|难以置信，需确认|Suspicious or too good to be true|\n",
    "\n",
    "#### (3)WOE与IV的计算方式\n",
    "\n",
    "<img src=\"ML img\\preview\\020b.png\">\n",
    "<img src=\"ML img\\preview\\020c.jpg\">\n",
    "\n",
    "https://www.cnblogs.com/zedliu/p/18360914"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fa5ae94a-e5f5-4125-973d-addc1f424898",
   "metadata": {},
   "source": [
    "### 7. 目标编码（Target Encoder）\n",
    "\n",
    "是一种有监督编码方法，适用于分类和回归任务中，高基类无序类别特征。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "973130b5-6cb0-401a-836c-3285e56679d0",
   "metadata": {},
   "source": [
    "### 8.平均编码（Mean Encoder）"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9b6b19b0-4c93-4f23-9e5b-33f359faa1cc",
   "metadata": {},
   "source": [
    "### 9.模型编码（Model Encoder）"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e9ddc340-de5e-48b0-987d-be8893fb3532",
   "metadata": {},
   "source": [
    "## (二)特征变换"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "06d1ae8b-69c5-4997-8266-a2e5e5db4800",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "### [1.box-cox变换](https://blog.csdn.net/weixin_43561290/article/details/101601438)\n",
    "\n",
    "  Box-Cox变换是统计建模中常用的一种数据变换，用于连续的响应变量不满足正态分布的情况。比如在使用线性回归的时候，由于残差$\\epsilon$不符合正态分布而不满足建模的条件，这时候要对响应变量Y进行变换，把数据变成正态的。Box-Cox变换，变换之后，可以一定程度上减小残差和预测变量的相关性。【Box-Cox变换即将数据转换为满足正态分布的数据】\n",
    "Box-Cox 变换的数学形式如下：$$y^{(\\lambda)}=\\begin{cases}\\frac{y^{\\lambda}-1}{\\lambda},&\\lambda\\neq0\\\\\\ln y,&\\lambda = 0\\end{cases}$$，其中$y$是原始数据，$y^{(\\lambda)}$是变换后的数据，$\\lambda$是变换参数。*最关键的问题在于怎样选定一个最优的λ，使得变换后的样本（及总体）正态性最好。*"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "35529f56-f191-4038-bb3b-fd17eb9218f8",
   "metadata": {},
   "source": [
    "### 2、Box-Tidwell变换\n",
    "Box - Tidwell变换是一种用于回归分析等统计方法中的数据变换技术，主要用于解决自变量与因变量之间可能存在的非线性关系以及数据不满足正态性等问题，以下是其详细介绍：\n",
    "\n",
    "#### (1)原理\n",
    "Box - Tidwell变换通过对自变量进行幂次变换，找到能使数据更好地满足回归模型假设的变换形式。其基本形式为：$X_{ij}^{(\\lambda_{j})}=\\frac{X_{ij}^{\\lambda_{j}} - 1}{\\lambda_{j}\\times(\\bar{X}_{j})^{\\lambda_{j}-1}}$，其中$X_{ij}$是第$i$个观测值的第$j$个自变量，$\\lambda_{j}$是第$j$个自变量的变换参数，$\\bar{X}_{j}$是第$j$个自变量的均值。通过估计每个自变量的最优$\\lambda_{j}$值，使变换后的自变量与因变量之间呈现更接近线性的关系，同时也可能使数据更符合正态性等模型假设。\n",
    "\n",
    "#### (2)应用场景\n",
    "- **处理非线性关系**：当自变量与因变量之间存在非线性关系时，Box - Tidwell变换可以尝试找到合适的幂次变换，将非线性关系转化为更接近线性的关系，从而提高回归模型的拟合效果和预测准确性。\n",
    "- **改善数据正态性**：如果自变量的数据分布不满足正态性假设，可能会影响回归分析的有效性。Box - Tidwell变换有时可以使数据的分布更接近正态分布，满足模型对数据分布的要求。\n",
    "- **解决异方差问题**：在一些数据中，误差项的方差可能随着自变量的变化而变化，即存在异方差性。Box - Tidwell变换在某些情况下可以帮助缓解异方差问题，使误差项的方差更稳定，提高模型的可靠性。\n",
    "\n",
    "### (3)计算步骤\n",
    "1. **设定初始值**：通常可以先假设所有自变量的$\\lambda_{j}$初始值为1，即先不进行变换，作为基准情况。\n",
    "2. **计算得分统计量**：对于每个自变量，计算其得分统计量（Score Statistic），这个统计量用于衡量当前$\\lambda_{j}$值的合理性，与似然函数等相关，其计算涉及到对数据的求导等复杂运算。\n",
    "3. **进行迭代**：根据得分统计量和相关的迭代算法，逐步调整$\\lambda_{j}$的值，使得似然函数值增大或满足一定的收敛条件。迭代过程会不断重复，直到达到预设的迭代次数上限或者$\\lambda_{j}$的变化小于某个阈值。\n",
    "4. **确定最优$\\lambda_{j}$值**：经过迭代后，得到的稳定的$\\lambda_{j}$值就是对该自变量的最优变换参数估计值。\n",
    "5. **进行变换**：根据得到的最优$\\lambda_{j}$值，对相应的自变量进行Box - Tidwell变换，得到变换后的自变量数据。\n",
    "\n",
    "#### (4)与其他变换方法比较\n",
    "- **与Box - Cox变换的区别**：Box - Cox变换主要是对因变量进行变换，目的是使因变量满足正态性等假设，而Box - Tidwell变换是针对自变量进行变换，主要解决自变量与因变量之间的关系问题及自变量的相关模型假设问题。\n",
    "- **优势**：相比一些简单的线性变换或对数变换等，Box - Tidwell变换可以通过估计最优的变换参数，更灵活地找到适合数据的变换形式，对各种复杂的数据关系和分布有更好的适应性。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b1f44345-c7e9-44b7-b6a6-d8be59f96257",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "## (三)特征选择"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3b17f458-2190-47c8-a225-69ec5634d1c6",
   "metadata": {},
   "source": [
    "## (四)组合特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "14ae9cad-0b48-453f-b06c-ee9b63e5a544",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.19"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
